const express = require('express');
const ejs = require('ejs'); // 模版引擎
const path = require('path')
const fs = require('fs');
// 实例化express;
const app = express();
const userList = require('./mock/user.json');
const proList = require('./mock/list.json')

/**
 * @param { 读取静态资源   } 完成
 * @param { 读文件（路由接口） } 完成
 * @param { 写接口（数据接口） } 
 * 
 * 相对路径
 * @param { ./ 同级 }
 * @param { ../ 上一级  }
 * 绝对路径
 * 根据电脑当前的盘符取去查找文件
 * /c：user/desktop/1802b/day18/work-express/public
*/

/**
 * 读取数据的接口配置 主要是处理post参数的接收参数问题
 * 当前这段代码放置在接口的最上面（必须）
* @description
*/
app.use(express.json())
app.use(express.urlencoded({
  extended: false
}))



/**
 * 读文件前的配置 ejs
*/
// 1. 找到你要读的文件在哪
app.set('views', path.join(__dirname, 'pages'))
// 2. 设置要读文件的是什么类型的的文件 .html （固定写法）
app.set('view engine', 'html')
// 3. 用什么引擎来读这个html文件呢？ejs.renderFile
app.engine('html', ejs.renderFile)

/**
 * 读取静态资源 找到静态资源路径即可，express.static会帮我们读取
*/
app.use(express.static('./public'))

/**
 * @fn文件区域
 * 
*/
// 4. 书写读取页面路由： 所有读取页面的路由都是get方式
app.get('/', (req, res, next) => {
  // render 方法第一个参数就是你想渲染的那个文件的名字
  // 第二个参数就是要传递给页面的数据
  res.render('login', {
    title: '登陆页面'
  })
})

// 5. 读取咱们的注册页面
app.get('/register', (req, res, next) => {
  // render 方法第一个参数就是你想渲染的那个文件的名字
  // 第二个参数就是要传递给页面的数据
  res.render('register', {
    title: '注册页面'
  })
})

// 6. 我们读取产品页面
app.get('/product', (req, res, next) => {
  // render 方法第一个参数就是你想渲染的那个文件的名字
  // 第二个参数就是要传递给页面的数据
  res.render('product', {
    title: '产品页面'
  })
})

// 7. addlist
app.get('/add', (req, res, next) => {
  // render 方法第一个参数就是你想渲染的那个文件的名字
  // 第二个参数就是要传递给页面的数据
  res.render('add', {
    title: '增加数据页面'
  })
})

// 8. updatelist
app.get('/update', (req, res, next) => {
  // render 方法第一个参数就是你想渲染的那个文件的名字
  // 第二个参数就是要传递给页面的数据
  res.render('update', {
    title: '更改数据接口'
  })
})


/**
 * @fn接口区域
 * api/** 
 * 
 * 登陆逻辑
 *  1. 接收账号密码 
 *  2. 匹配数据库（本地的user.json文件中是否已经存储了这个账号密码）
 *  3. 判断当前用户传输过来的账号密码是否已经存在了
 *  4. 存在  直接告诉用户，登陆成功了
 *  5. 不存在 账号密码不对，
 * 
 * 注册逻辑
 *  1. 接收账号密码 
 *  2. 匹配数据库（本地的user.json文件中是否已经存储了这个账号密码）
 *  3. 判断当前用户传输过来的账号密码是否已经存在了
 *  4. 存在   提醒用户换个账号注册
 *  5. 不存在 直接把用户的数据写入文件，就相当于注册成功了
 * 
 * 
*/
// 登陆接口
app.post('/api/login', (req, res, next) => {
  // express把post接收的参数放置在了body上面
  const { user, pwd } = req.body;
  let flag = userList.some((val) => val.name === user && val.pwd === pwd);
  if (flag) {
    res.send({
      code: 0,
      msg: 'success'
    })
  } else {
    res.send({
      code: -1,
      msg: 'fail'
    })
  }
})

// 注册接口
app.post('/api/register', (req, res, next) => {
  // express把post接收的参数放置在了body上面
  const { user, pwd } = req.body;
  let flag = userList.some((val) => val.name === user && val.pwd === pwd);
  if (flag) {
    res.send({
      code: -1,
      msg: 'fail'
    })
  } else {
    // 先把数据放在一个统一的数组中
    userList.push(req.body)
    // 把这个存储所有人账号密码的数组 写入到咱们的json文件中
    fs.writeFileSync('./mock/user.json', JSON.stringify(userList))
    res.send({
      code: 0,
      msg: 'sucess'
    })
  }
})

// 列表接口
app.get('/api/list', (req, res, next) => {
  res.send({
    code: 0,
    msg: 'success',
    data: proList
  })
})

// 增加列表数据的接口 增加的数据接口都是post方式
app.post('/api/add', (req, res, next) => {
  // const { name, gender, address, date } = req.body;
  proList.push(req.body)
  fs.writeFileSync('./mock/list.json', JSON.stringify(proList))
  res.send({
    code: 0,
    msg: 'sucess',
    data: proList
  })
})
// 分页
app.get('/api/page', (req, res, next) => {
  // 接收 第几页 每页多少条
  const { page, size } = req.query;
  // page: 0  size: 5    
  // 0 >= index   index < 5   ( 0 --- 4) 前五条数据
  // page: 1 size: 5;
  // 1*5 5 >= index  && index < 10 2*5
  // page: 2 size: 5;
  // 2*5 10 >= index && index < 15 3*5
  let pageData = proList.filter((v, index) => index >= page * size && index < (page * 1 + 1) * size)
  res.send({
    code: 0,
    msg: 'success',
    data: pageData,
    total: proList.length
  })
})

// 删除
app.get('/api/delete', (req, res, next) => {
  const { index } = req.query;
  proList.splice(index, 1)
  fs.writeFileSync('./mock/list.json', JSON.stringify(proList))
  res.send({
    code: 0,
    msg: 'success',
    data: proList,
  })
})

// 更改数据接口
app.post('/api/update', (req, res, next) => {
  const { index } = req.body;
  console.log(index, 'indexx')
  // index
  // name: 
  // address: 
  // gender: nv
  // date: 
  // 要把要更改的数据都发送过来
  proList.splice(index, 1, req.body)
  fs.writeFileSync('./mock/list.json', JSON.stringify(proList))
  res.send({
    code: 0,
    msg: 'success',
    data: proList,
  })
})


app.listen(9999, () => {
  console.log('server port is 9999')
})